//SPDX-FileCopyrightText: Copyright 2022-2024 深圳市同心圆网络有限公司
//SPDX-License-Identifier: GPL-3.0-only

package docker_template_api_serv

import (
	"context"

	"atomgit.com/openlinksaas/api-server/dao/docker_dao"
	"atomgit.com/openlinksaas/proto-gen-go.git/docker_template_api"
)

type DockerTemplateImpl struct {
	docker_template_api.UnimplementedDockerTemplateApiServer
}

func (apiImpl *DockerTemplateImpl) ListCate(ctx context.Context, req *docker_template_api.ListCateRequest) (*docker_template_api.ListCateResponse, error) {
	cateItemList, err := docker_dao.CateDao.List(ctx)
	if err != nil {
		return nil, err
	}
	infoList := []*docker_template_api.CateInfo{}
	for _, cateItem := range cateItemList {
		infoList = append(infoList, cateItem.ToCateInfo())
	}
	return &docker_template_api.ListCateResponse{
		Code:         docker_template_api.ListCateResponse_CODE_OK,
		CateInfoList: infoList,
	}, nil
}

func (apiImpl *DockerTemplateImpl) ListAppWithTemplate(ctx context.Context, req *docker_template_api.ListAppWithTemplateRequest) (*docker_template_api.ListAppWithTemplateResponse, error) {
	count, err := docker_dao.AppDao.Count(ctx, req.FilterByCateId, req.CateId, req.FilterByKeyword, req.Keyword)
	if err != nil {
		return nil, err
	}
	appItemList, err := docker_dao.AppDao.List(ctx, req.FilterByCateId, req.CateId, req.FilterByKeyword, req.Keyword, int64(req.Offset), int64(req.Limit))
	if err != nil {
		return nil, err
	}

	appIdList := []string{}
	for _, appItem := range appItemList {
		appIdList = append(appIdList, appItem.AppId)
	}

	templateItemList, err := docker_dao.TemplateDao.ListById(ctx, appIdList)
	if err != nil {
		return nil, err
	}
	templateItemMap := map[string][]*docker_dao.TemplateInfoDbItem{}
	for _, templateItem := range templateItemList {
		tmpList, ok := templateItemMap[templateItem.AppId]
		if !ok {
			tmpList = []*docker_dao.TemplateInfoDbItem{}
		}
		tmpList = append(tmpList, templateItem)
		templateItemMap[templateItem.AppId] = tmpList
	}

	cateItemList, err := docker_dao.CateDao.List(ctx)
	if err != nil {
		return nil, err
	}
	cateNameMap := map[string]string{}
	for _, cateItem := range cateItemList {
		cateNameMap[cateItem.CateId] = cateItem.CateName
	}

	//获取应用截图
	imageItemList, err := docker_dao.AppImageDao.ListByApp(ctx, appIdList)
	if err != nil {
		return nil, err
	}
	imageMap := map[string][]*docker_template_api.AppImage{}
	for _, imageItem := range imageItemList {
		image := imageItem.ToAppImage()
		oldList, ok := imageMap[imageItem.AppId]
		if !ok {
			oldList = []*docker_template_api.AppImage{}
		}
		oldList = append(oldList, image)
		imageMap[imageItem.AppId] = oldList
	}

	//生成结果
	infoList := []*docker_template_api.AppWithTemplateInfo{}
	for _, appItem := range appItemList {
		appInfo := appItem.ToAppInfo()
		appInfo.CateName = cateNameMap[appItem.CateId]

		templateInfoList := []*docker_template_api.TemplateInfo{}
		templateItemList, ok := templateItemMap[appItem.AppId]
		if ok {
			for _, templateItem := range templateItemList {
				templateInfoList = append(templateInfoList, templateItem.ToTemplateInfo())
			}
		}
		imageList, ok := imageMap[appItem.AppId]
		if !ok {
			imageList = []*docker_template_api.AppImage{}
		}
		appInfo.ImageList = imageList

		infoList = append(infoList, &docker_template_api.AppWithTemplateInfo{
			AppInfo:          appInfo,
			TemplateInfoList: templateInfoList,
		})
	}
	return &docker_template_api.ListAppWithTemplateResponse{
		Code:       docker_template_api.ListAppWithTemplateResponse_CODE_OK,
		TotalCount: count,
		InfoList:   infoList,
	}, nil
}

func (apiImpl *DockerTemplateImpl) GetAppWithTemplate(ctx context.Context, req *docker_template_api.GetAppWithTemplateRequest) (*docker_template_api.GetAppWithTemplateResponse, error) {
	emptyInfo := &docker_template_api.AppWithTemplateInfo{
		AppInfo:          &docker_template_api.AppInfo{},
		TemplateInfoList: []*docker_template_api.TemplateInfo{},
	}

	exist, err := docker_dao.AppDao.Exist(ctx, req.AppId)
	if err != nil {
		return nil, err
	}
	if !exist {
		return &docker_template_api.GetAppWithTemplateResponse{
			Code:   docker_template_api.GetAppWithTemplateResponse_CODE_NO_APP,
			ErrMsg: "DOCKER模板不存在",
			Info:   emptyInfo,
		}, nil
	}
	appItem, err := docker_dao.AppDao.Get(ctx, req.AppId)
	if err != nil {
		return nil, err
	}
	cateItem, err := docker_dao.CateDao.Get(ctx, appItem.CateId)
	if err != nil {
		return nil, err
	}
	appInfo := appItem.ToAppInfo()
	appInfo.CateName = cateItem.CateName

	imageItemList, err := docker_dao.AppImageDao.ListByApp(ctx, []string{req.AppId})
	if err != nil {
		return nil, err
	}
	imageList := []*docker_template_api.AppImage{}
	for _, imageItem := range imageItemList {
		imageList = append(imageList, imageItem.ToAppImage())
	}

	appInfo.ImageList = imageList

	templateItemList, err := docker_dao.TemplateDao.List(ctx, req.AppId)
	if err != nil {
		return nil, err
	}
	templateInfoList := []*docker_template_api.TemplateInfo{}
	for _, templateItem := range templateItemList {
		templateInfoList = append(templateInfoList, templateItem.ToTemplateInfo())
	}

	return &docker_template_api.GetAppWithTemplateResponse{
		Code: docker_template_api.GetAppWithTemplateResponse_CODE_OK,
		Info: &docker_template_api.AppWithTemplateInfo{
			AppInfo:          appInfo,
			TemplateInfoList: templateInfoList,
		},
	}, nil
}
